package handlers

import (
	"encoding/json"
	"net/http"
	"shopping-backend/models"
	"strconv"

	"github.com/gorilla/mux"
	"golang.org/x/crypto/bcrypt"
)

// Register 用户注册
    // @Summary 用户注册
    // @Description 注册一个新用户，包括用户名、密码和邮箱的验证及加密存储。
    // @Tags 用户
    // @Accept json
    // @Produce json
    // @Param user body models.User true "用户信息"
    // @Success 201 {string} string "用户注册成功"
    // @Failure 400 {string} string "请求参数错误"
    // @Failure 409 {string} string "用户名或邮箱已存在"
    // @Failure 500 {string} string "服务器内部错误"
    // @Router /users [post]
func Register(w http.ResponseWriter, r *http.Request) {
    var user models.User
    if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    // 检查用户名是否已存在
    existingUser, err := models.GetUserByUsername(user.Username)
    if err == nil && existingUser.Username != "" {
        http.Error(w, "用户名已存在", http.StatusBadRequest)
        return
    }

    // 检查邮箱是否已存在
    existingEmail, err := models.GetUserByEmail(user.Email)
    if err == nil && existingEmail.Email != "" {
        http.Error(w, "邮箱已存在", http.StatusBadRequest)
        return
    }

    // 加密密码
    // hashedPassword, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
    // if err != nil {
    //     log.Println("Failed to hash password:", err)
    //     http.Error(w, "服务器内部错误", http.StatusInternalServerError)
    //     return
    // }
    // user.Password = string(hashedPassword)

    // 调用模型层的 AddUser 函数将用户添加到数据库
    _, err = models.AddUser(user)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(map[string]string{"message": "用户注册成功"})
}

// Login 用于用户登录
    // @Summary 用户登录
    // @Description 登录系统，需要用户名和密码。
    // @Tags 用户
    // @Accept json
    // @Produce json
    // @Param login body models.User{Username string `json:"username"`; Password string `json:"password"`} true "登录信息"
    // @Success 200 {string} string "登录成功", "token":"fake-jwt-token"
    // @Failure 400 {string} string "请求参数错误"
    // @Failure 401 {string} string "无效的用户名或密码"
    // @Router /login [post]
func Login(w http.ResponseWriter, r *http.Request) {
    var loginRequest struct {
        Username string `json:"username"`
        Password string `json:"password"`
    }

    if err := json.NewDecoder(r.Body).Decode(&loginRequest); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    // 查询数据库中的用户信息
    user, err := models.GetUserByUsername(loginRequest.Username)
    if err != nil {
        http.Error(w, "无效的用户名或密码", http.StatusUnauthorized)
        return
    }

    // 验证密码
    err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(loginRequest.Password))
    if err != nil {
        http.Error(w, "无效的用户名或密码", http.StatusUnauthorized)
        return
    }

    // 假设登录成功，返回一个模拟的 JWT 或会话 ID
    token := "fake-jwt-token"

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(map[string]string{
        "message": "登录成功",
        "token":   token, // 返回 token 或会话 ID
    })
}

// GetUser 用于根据用户 ID 获取用户信息
    // @Summary 获取用户信息
    // @Description 根据用户ID获取用户详细信息。
    // @Tags 用户
    // @Accept json
    // @Produce json
    // @Param id path int true "用户ID"
    // @Success 200 {object} models.User "用户信息"
    // @Failure 400 {string} string "无效用户ID"
    // @Failure 404 {string} string "用户未找到"
    // @Failure 500 {string} string "服务器内部错误"
    // @Router /users/{id} [get]
func GetUser(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    idStr := vars["id"]

    id, err := strconv.Atoi(idStr)
    if err != nil {
        http.Error(w, "无效用户ID", http.StatusBadRequest)
        return
    }

    user, err := models.GetUserByID(id)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user)
}

// DeleteUser 用于删除用户账户及其相关数据
    // DeleteUser 删除用户
    // @Summary 删除用户
    // @Description 根据用户ID删除用户账户及其相关数据。
    // @Tags 用户
    // @Accept json
    // @Produce json
    // @Param id path int true "用户ID"
    // @Success 200 {string} string "用户删除成功"
    // @Failure 400 {string} string "无效用户ID"
    // @Failure 404 {string} string "用户未找到"
    // @Failure 500 {string} string "服务器内部错误"
    // @Router /users/{id} [delete]
func DeleteUser(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    userID, err := strconv.Atoi(vars["id"])
    if err != nil {
        http.Error(w, "无效用户ID", http.StatusBadRequest)
        return
    }

    // 调用 DeleteUser 删除用户
    rowsAffected, err := models.DeleteUser(userID)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    if rowsAffected == 0 {
        http.Error(w, "用户未找到", http.StatusNotFound)
        return
    }

    // 返回删除成功的响应
    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(map[string]string{
        "message": "用户删除成功",
    })
}